package fr.miage.shopping.dao.traitements;
/**
 * @author Kristela
 *
 */
import fr.miage.shopping.metier.entite.Admin;
import fr.miage.shopping.metier.entite.Categorie;

import fr.miage.shopping.metier.entite.Client;
import fr.miage.shopping.metier.entite.Commande;
import fr.miage.shopping.metier.entite.Lignecommande;
import fr.miage.shopping.metier.entite.Produit;
import fr.miage.shopping.metier.entite.Role;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.hibernate.criterion.Expression;

/**
 * @author kristela
 *
 */
public class AdminDao {

    /**
     * Retourne une session.
     *
     * @return la session.
     */
    public static Session getSession() {
        Configuration config = new Configuration();
        config.addClass(Client.class);
        config.addClass(Commande.class);
        config.addClass(Lignecommande.class);
        config.addClass(Produit.class);
        config.addClass(Admin.class);
        config.addClass(Categorie.class);
        config.addClass(Role.class);
        SessionFactory sessionFactory = config.buildSessionFactory();
        Session session = sessionFactory.openSession();
        return session;
    }

    /**
     *
     * @param mail l'adresse email de la personne
     * @param password , mot de passe de la personne
     * @return l'administrateur de la base
     */
    public static Admin authentifierAdmin(String mail, String password) {
        Admin admin = null;
        Session session = getSession();
        if (session == null) {
            System.out.println("Pas de connexion!");
            System.exit(0);
        }
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            Criteria criteria = session.createCriteria(Admin.class);
            criteria.add(Expression.eq("login", mail));
            criteria.add(Expression.eq("password", password));
            List<Admin> liste = criteria.list();
            if (liste.size() == 1) {
                admin = liste.get(0);
            }
            tx.commit();

        } catch (Exception e) {
            if (tx != null) {
                tx.rollback();
            }
            e.printStackTrace();
        } finally {
            session.close();
        }

        session.getSessionFactory().close();
        return admin;
    }

    /**
     * Ajoute un nouveau client dans la base de donnees.
     *
     * @param admin : l'administrateur a ajouté
     *            
     */
    public static void insertAdmin(Admin admin) {
        Session session = getSession();
        if (session == null) {
            System.out.println("Pas de connexion!");
            System.exit(0);
        }
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            session.saveOrUpdate(admin);
            tx.commit();
        } catch (Exception e) {
            if (tx != null) {
                tx.rollback();
            }
            e.printStackTrace();
        } finally {
            session.close();
        }

        session.getSessionFactory().close();
    }

    /**
     * Sélectionner un administrateur
     *
     * @param admin l'administrateur
     * @return l'administrateur
     */
    public static Admin selectAdmin(Admin admin) {
        Session session = getSession();
        if (session == null) {
            System.out.println("Pas de connexion!");
            System.exit(0);
        }
        Admin ad = new Admin();
        session.load(ad, admin.getIdAdmin());
        return ad;
    }

    /**
     * Renvoie la liste de touts les admins.
     *
     * @return tous les admins.
     */
    public static List<Admin> selectAllAdmin() {
        List<Admin> listAdmin = new ArrayList<Admin>();
        Session session = getSession();
        if (session == null) {
            System.out.println("Pas de connexion!");
            System.exit(0);
        }
        listAdmin = session.find("from Admin");
        session.close();
        session.getSessionFactory().close();
        return listAdmin;
    }

    /**
     * Effacer le compte epargne correspondant a un numero.
     *
     * @param numero
     *            le numero du compte.
     */
    public static void deleteAdmin(Admin admin) {
        Session session = getSession();
        if (session == null) {
            System.out.println("Pas de connexion!");
            System.exit(0);
        } else {
            session.delete(admin);
        }
    }

    /**
     * Met à jour un administrateur
     * @param admin
     */
    public static void updateAdmin(Admin admin) {
        Session session = getSession();
        if (session == null) {
            System.out.println("Pas de connexion!");
            System.exit(0);
        } else {
            session.update(admin);
        }
    }

    /**
     * Récupérer le critère de l'administrateur
     * @param admin l'administrateur a récupér
     * @return le critère de l'administrateur
     */
    public static String getAdminCritere(Admin admin) {
        StringBuffer sql = new StringBuffer("SELECT * FROM admin  WHERE idAdmin=" + admin.getIdAdmin() + " ");
        if (admin.getLogin() != null) {
            sql.append("AND login=\"" + admin.getLogin() + "\" ");
        }
        if (admin.getPassword() != null) {
            sql.append("AND password=\"" + admin.getPassword() + "\" ");
        }
        if (admin.getEmail() != null) {
            sql.append("AND email=\"" + admin.getEmail() + "\" ");
        }
        if (admin.getRole() != null) {
            sql.append("AND role=\"" + admin.getRole() + "\" ");
        }
        sql.append(";");
        return sql.toString();
    }
}
